/**
 * @file txr_algo_dlm_v5_o.h
 * @brief TxrAlgoDlmV5_o类定义，实现目标检测算法
 */

#ifndef TXR_ALGO_DLM_V5_O_H
#define TXR_ALGO_DLM_V5_O_H

#pragma once

#include "model_infer_vino.h"
#include "txr_algo_dlm_v5_o_global.h"
#include "../txr_algo_dlm/txr_algo_dlm_impl.h"
#include "common/define.h"

namespace vino_v6
{
    class Yolo_VINO;
}

using namespace vino_v6;

namespace txr_algo_dlm
{
    const std::string MODEL_FILE_SUFFIX = ".ohdats";

    class TxrAlgoDlmV5_o final : public TxrAlgoDlmImpl
    {
    public:
        /**
         * 构造函数
         */
        TxrAlgoDlmV5_o();

        /**
         * 析构函数
         */
        ~TxrAlgoDlmV5_o() override;

        /**
         * 加载配置文件
         * @param cfg 配置结构体引用
         * @return 成功返回true，失败返回false
         */
        tk_bool Load(st_dlm_cfg & cfg) override;

        /**
         * 获取批处理大小
         * @return 批处理大小，未初始化返回0
         */
        tk_int32 BatchSize() override;

        /**
         * 对输入的检测单元数组进行目标检测
         * @param p_unit 输入检测单元数组指针
         * @param size 输入检测单元数量
         */
        void Detect(st_detect_unit * p_unit, tk_int32 size) override;

        /**
         * 释放检测模型相关资源
         */
        void Release();

    private:
        vino_v6::Yolo_VINO *m_p_detect;
    };

    /**
     * 创建并返回TxrAlgoDlmV5_o对象
     */
    extern "C" TXR_ALGO_DLM_V5_O_EXPORT TxrAlgoDlmImpl* CreateDlmObj();

    /**
     * 安全删除TxrAlgoDlmImpl类型对象
     */
    extern "C" TXR_ALGO_DLM_V5_O_EXPORT void DeleteDlmObj(TxrAlgoDlmImpl* p);
}

#endif // TXR_ALGO_DLM_V5_O_H